package com.ck.server.controller.test;
import com.ck.common.annotation.DataSource;
import com.ck.common.annotation.OperationLog;
import com.ck.common.constant.AjaxResult;
import com.ck.common.entity.SourceEntity;
import com.ck.common.enums.DataSourceType;
import com.ck.common.utils.txt.StringUtils;
import com.ck.system.mapper.DynamicMapper;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * 动态数据源实现思路:
 * 1、基于注解方式来优雅的实现，自定义注解，并且通过Aop去切面 类 or方法上的注解，从而得知是什么数据源，在Aop里通过ThreadLocal设置当前线程的数据源
 * 2、实现 druid 多数据源的配置类,注册你需要的数据源的Bean。也就是配置好 多数据源的几个源才能实现数据源的切换
 *
 * 遇到的问题:
 *      1、出现了加载Bean循环依赖问题,需在启动类上exclude DataSourceAutoConfiguration.class这个自动装配类
 *      (DataSourceAutoConfiguration 是 Spring Boot 的自动配置类之一，它会尝试根据你的配置自动创建一个默认的数据源（即连接到默认的数据库）)
 */

/**
 * @author ck
 * @date 2023/8/31 11:04
 */

@RestController
@RequestMapping("/dynamic")
@Slf4j
@Api(tags = "动态数据源切换测试接口")
public class DynamicDataSourceController {

    @Autowired
    DynamicMapper dynamicMapper;


    @GetMapping("/source")
    @DataSource(DataSourceType.MASTER)
    @OperationLog(title = "动态数据源测试接口")
    public AjaxResult DynamicDataSourceTest(String id){
        if (StringUtils.isEmpty(id)){
            return AjaxResult.error("参数不能为空");
        }
        SourceEntity masterSourceEntity = dynamicMapper.selectById(id);
        if (masterSourceEntity!=null){
            log.info("master数据查询数据为:{}",masterSourceEntity.toString());
        }

//        SourceEntity slaveSourceEntity = dynamicMapper.selectById(id);
//        if (slaveSourceEntity!=null){
//            log.info("slave数据查询数据为:{}",slaveSourceEntity.toString());
//        }
        return AjaxResult.success().put("data",masterSourceEntity);
    }
}
